隨著時間資料累積久都會有佔空間與查詢不易的問題,在Mysql的日誌中常用的error log 和 slow log 都是寫入同一個文件中,在使用找紀錄上說真的不太方便。
以下內容會用到,先認識一下這句指令意思:
#關閉並重新打開服務器正在寫入的任何日誌文件(達到清除或重新加載各種內部緩存效果)
mysql> FLUSH LOGS;
官方FLUSH語句詳細參考
下這句時可以發現binlog的話作用會截斷當前日誌產生一個新的EX:mysql_bin.00000x檔。而對於error log紀錄來說沒影響因為寫入的都是同一個文件,所以藉由FLUSH作用重新載入方便我們用換檔名產生新error.log檔的方式去做到日誌切割~
這時候就可以用到Linux默認安裝的logrotate 日誌切割工具,基於cron運行,對於不斷增長的紀錄,可將內容按時間大小做區分並刪除,有效節省空間使用及管理上的便利。相較於自己寫shell完還要掛crontab上去跑,logrotate設定後就會根據設定時間去執行!
內容 | 位置 |
---|---|
主配置文件 | /etc/logrotate.conf |
自定義配置 | /etc/logrotate.d/... |
大致上運行機制:
每天運行系統自帶排成 /etc/cron.daily/logrotate -> logrotate 腳本內容以 /etc/logrotate.conf 為配置文件執行logrotate ->logrotate.conf 腳本會透過 include 引入 /etc/logrotate.d/ 目錄底下的配置文件。
設定上:
vim /etc/logrotate.d/mysql
/var/log/mysql/error.log {
create 600 mysql mysql #指定切換後檔案權限
daily #每日切換
rotate 7 #保留7個切換後的檔案,多的會被刪除
dateext #切換後的檔名加上日期
missingok #切換期間,有錯誤則忽略EX:日誌檔不存在
compress #舊的檔案以壓縮方式儲存
delaycompress #最近的檔案在下一次切換時才進行壓縮
postrotate
# 確認mysql運作
if test -x /usr/bin/mysqladmin && \
/usr/bin/mysqladmin -u root -p1234 ping &>/dev/null
then
/usr/bin/mysqladmin -u root -p1234 flush-logs
fi
endscript
}
3.手動切換Debug確認執行內容
logrotate -vf /etc/logrotate.d/mysql
4.執行沒問題就可以看到log內容被切換至日期檔了
#幾天後會像這樣,根據日期分配在查找紀錄上也會方便許多。
root@mysql-master:/var/log/mysql# ll
total 1452
drwxr-x--- 2 mysql adm 4096 Aug 5 06:25 ./
drwxrwxr-x 10 root syslog 4096 Aug 5 06:25 ../
-rw------- 1 mysql mysql 521988 Aug 6 02:23 error.log
-rw------- 1 mysql mysql 76255 Aug 1 06:25 error.log-20210801.gz
-rw------- 1 mysql mysql 76339 Aug 2 06:25 error.log-20210802.gz
-rw------- 1 mysql mysql 76457 Aug 3 06:24 error.log-20210803.gz
-rw------- 1 mysql mysql 79362 Aug 4 06:25 error.log-20210804.gz
-rw------- 1 mysql mysql 630110 Aug 5 06:25 error.log-20210805